package br.com.vendaext.gerencial.integracao;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

import org.hibernate.Criteria;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import br.com.vendaext.gerencial.entidades.Modulo;
import br.com.vendaext.gerencial.entidades.Perfil;
import br.com.vendaext.gerencial.entidades.Permissao;

@Repository
@Scope("session")
public class PermissaoDAO extends DAOGenerico<Permissao> {

	@Override
	@Transactional
	public void inserir(Permissao entidade) {
		entidade.setDescricao(entidade.getFuncionalidade().getNome() + "-" + entidade.getModulo().getNome());
		super.inserir(entidade);
	}
	
	@Transactional(readOnly=true)
	public Map<Modulo, Collection<Permissao>> listarModuloPermissao(Perfil p){
		Map<Modulo, Collection<Permissao>> retorno = new HashMap<Modulo, Collection<Permissao>>();
		
		Criteria ct2 = criarCriteria(Perfil.class);
		ct2.createAlias("permissao", "permissao");
		ct2.createAlias("permissao.modulo", "permissao.modulo");
		ct2.add(Restrictions.idEq(p.getId()));
		ct2.setProjection(Projections.distinct(Projections.property("permissao.modulo")));
		Collection<Modulo> mods = ct2.list();
		
		for (Modulo modulo : mods) {
			
			Criteria ctPermissao = criarCriteria(Perfil.class);
			ctPermissao.createAlias("permissao", "permissao");
			ctPermissao.createAlias("permissao.modulo", "permissao.modulo");
			ctPermissao.add(Restrictions.idEq(p.getId()));
			ctPermissao.add(Restrictions.eq("permissao.modulo", modulo));
			ctPermissao.setProjection(Projections.distinct(Projections.property("permissao.id")));
			
			Collection<Permissao> perm = criarCriteria().add(Restrictions.in("id", ctPermissao.list())).list();
			
			retorno.put(modulo, perm);
		}
		
		

		return retorno;
	}

	@SuppressWarnings("unchecked")
	public Collection<Permissao> getPermissoesPerfil(Perfil perfil) {
		Criteria ct = getSession().createCriteria(Perfil.class);
		ct.createAlias("permissao", "permissao");
		ct.add(Restrictions.idEq(perfil.getId()));
		ct.setProjection(Projections.property("permissao.id"));
		
		Criteria ct2 = criarCriteria();
		ct2.add(Restrictions.in("id", ct.list()));
		
		return ct2.list();
	}

}
